์ž‘์„ฑ: 2026-03-04 04:03:38์ˆ˜์ •: 2026-03-04 04:03:38

JWT์™€ ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๊ตฌํ˜„ํ•˜๊ธฐ: ์„ธ์…˜ ์—†๋Š” ๋ณด์•ˆ ์„ค๊ณ„

์ „ํ†ต์ ์ธ ์„ธ์…˜ ๋ฐฉ์‹์€ ์„œ๋ฒ„์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์„œ๋ฒ„ ํ™•์žฅ ์‹œ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ต๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. **JWT(JSON Web Token)**๋Š” ์ธ์ฆ ์ •๋ณด๋ฅผ ํ† ํฐ ์ž์ฒด์— ๋‹ด์•„ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๊ด€ํ•˜๊ฒŒ ํ•จ์œผ๋กœ์จ, **Stateless(์ƒํƒœ ์—†์Œ)**ํ•œ ํ™•์žฅ์ด ์šฉ์ดํ•œ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


1. JWT์˜ ๊ตฌ์กฐ

JWT๋Š” ์ (.)์œผ๋กœ ๊ตฌ๋ถ„๋œ ์„ธ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • Header: ํ† ํฐ์˜ ํƒ€์ž…๊ณผ ์‚ฌ์šฉ ์ค‘์ธ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜ (์˜ˆ: HS256).
  • Payload: ํ† ํฐ์— ๋‹ด์„ ์ •๋ณด(Claim). ์œ ์ € ID, ๊ถŒํ•œ, ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ๋“ฑ.
  • Signature: ์„œ๋ฒ„๋งŒ ์•Œ๊ณ  ์žˆ๋Š” ๋น„๋ฐ€ํ‚ค๋กœ ์ƒ์„ฑํ•œ ์„œ๋ช…. ํ† ํฐ์˜ ์œ„๋ณ€์กฐ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

2. JWT ์ธ์ฆ ์›Œํฌํ”Œ๋กœ์šฐ

  1. ๋กœ๊ทธ์ธ: ์œ ์ €๊ฐ€ ์•„์ด๋””/๋น„๋ฒˆ์œผ๋กœ ๋กœ๊ทธ์ธ ์š”์ฒญ.
  2. ํ† ํฐ ์ƒ์„ฑ: ์„œ๋ฒ„๊ฐ€ ์œ ํšจ์„ฑ์„ ํ™•์ธํ•˜๊ณ  JWT๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์‘๋‹ต.
  3. ์š”์ฒญ: ํด๋ผ์ด์–ธํŠธ๋Š” ์ดํ›„ ๋ชจ๋“  ์š”์ฒญ์˜ Authorization ํ—ค๋”์— Bearer <Token>์„ ๋„ฃ์–ด ๋ณด๋ƒ„.
  4. ๊ฒ€์ฆ: ์„œ๋ฒ„๋Š” ์„œ๋ช…์„ ํ™•์ธํ•˜๊ณ , ์œ ํšจํ•˜๋ฉด ์š”์ฒญ์„ ์ฒ˜๋ฆฌ.

3. Spring Boot์—์„œ JWT ๊ตฌํ˜„ (ํ•ต์‹ฌ ์ฝ”๋“œ)

jjwt ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ† ํฐ์„ ์ƒ์„ฑํ•˜๊ณ  ๊ฒ€์ฆํ•˜๋Š” ๋กœ์ง์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.

public String createToken(String userPk, List<String> roles) {
    Claims claims = Jwts.claims().setSubject(userPk);
    claims.put("roles", roles);
    Date now = new Date();
    
    return Jwts.builder()
            .setClaims(claims)
            .setIssuedAt(now)
            .setExpiration(new Date(now.getTime() + tokenValidTime)) // ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ์„ค์ •
            .signWith(SignatureAlgorithm.HS256, secretKey) // ์•”ํ˜ธํ™”
            .compact();
}

4. JWT ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ

  1. ๋ฏผ๊ฐ ์ •๋ณด ๊ธˆ์ง€: ํŽ˜์ด๋กœ๋“œ๋Š” ๋ˆ„๊ตฌ๋‚˜ ๋””์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฐ™์€ ์ •๋ณด๋Š” ์ ˆ๋Œ€ ๋„ฃ์ง€ ๋งˆ์„ธ์š”.
  2. ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ์„ค์ •: ํ† ํฐ์ด ํƒˆ์ทจ๋  ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•ด Access Token์˜ ์ˆ˜๋ช…์€ ์งง๊ฒŒ(์˜ˆ: 30๋ถ„) ์„ค์ •ํ•˜๊ณ , Refresh Token์„ ๋ณ‘ํ–‰ ์‚ฌ์šฉํ•˜์„ธ์š”.
  3. Secret Key ๋ณด์•ˆ: ๋น„๋ฐ€ํ‚ค๊ฐ€ ์œ ์ถœ๋˜๋ฉด ์ „์ฒด ๋ณด์•ˆ์ด ๋ฌด๋„ˆ์ง‘๋‹ˆ๋‹ค. ๋ฐ˜๋“œ์‹œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋‚˜ Secret Manager๋กœ ๊ด€๋ฆฌํ•˜์„ธ์š”.

5. ๊ฒฐ๋ก 

JWT๋Š” ํ˜„๋Œ€์ ์ธ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜(MSA)์™€ ๋ชจ๋ฐ”์ผ ์•ฑ ์—ฐ๋™์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ์ธ์ฆ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„์˜ ๋ถ€๋‹ด์„ ์ค„์ด๊ณ  ์œ ์—ฐํ•œ ํ™•์žฅ์„ ์›ํ•˜์‹ ๋‹ค๋ฉด JWT ๋„์ž…์„ ์ ๊ทน ๊ณ ๋ คํ•ด ๋ณด์„ธ์š”!